package com.zyl.Ecs.realtime.datasource;

import com.zyl.Ecs.common.utils.CUtil;

import java.util.Optional;

/**
 * @version v1.0
 * @ProjectName: Ecs
 * @Package: com.zyl.Ecs.realtime.datasource
 * @ClassName: DataSourceContextHolder
 * @Description TODO 数据切换工具类
 * @Author 翟玉龙
 * @Date 2024/12/6-13:51
 */
public class DataSourceContextHolder {

    private static final ThreadLocal<DataSourceTypeEnum> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 切换为写数据源（将表示主库数据源的枚举实例存入线程局部变量）
     */
    public static void master() {
        set(DataSourceTypeEnum.MASTER);
    }

    /**
     * 切换为从数据源（将表示从库数据源的枚举实例存入线程局部变量）
     */
    public static void slave() {
        set(DataSourceTypeEnum.SLAVE);
    }

    public static void set(DataSourceTypeEnum dataSourceTypeEnum) {
        CONTEXT_HOLDER.set(dataSourceTypeEnum);
    }

    /**
     * 获取数据源Key（默认使用主库）
     */
    public static DataSourceTypeEnum getDataSourceType() {
        return Optional.ofNullable(CONTEXT_HOLDER.get())
                .orElse(DataSourceTypeEnum.MASTER);
    }

    /**
     * 清空ThreadLocal线程局部变量
     * 当每个客户端线程（处理完整请求响应的整体流程）处理完一次任务之后，
     * 把对应的线程局部变量清空掉，防止对后续的调用产生影响。
     */
    public static void removeDataSourceType() {
        CONTEXT_HOLDER.remove();
        CUtil.logDebug("[DataSourceContextHolder] ThreadLocal is clear...");
    }
}